package com.codelint.gt20post;

import com.codelint.gt20post.pojo.GTObject;
import com.tools.ProtocolUtil;
import com.tools.StringUtil;

/**
 * User: light
 * Date: 5/27/13
 * Time: 4:52 PM
 */
public class GT20Converter implements IGTConverter {
    public String convert(String input) {
        // 信息头（2 字节）
        String xinXiTou = input.substring(0, 2 * 2);
        System.out.print("信息头:" + xinXiTou);
        input = input.substring(2 * 2);
        // 内容长度（1 字节）
        String neiRongChangDu = input.substring(0, 1 * 2);
        neiRongChangDu = Integer.parseInt(neiRongChangDu, 16) + "";
        input = input.substring(1 * 2);
        // 保留位(2 字节)
        String baoLiuWei = input.substring(0, 2 * 2);
        input = input.substring(2 * 2);
        // imei 号(trakcer 代号)
        String imei = input.substring(0, 8 * 2);
        input = input.substring(8 * 2);
        // 得到 15 位 IMEI 号，去掉第一个字节 0
        imei = imei.substring(1);
        // 这里可能需要做些 IMEI 号验证，如当前这个 IMEI 号是否是我们系统里的设备
        // 如果不是，要做些什么处理，以公司业务决定
        // 信息序列号(2 字节)
        String xuLieHao = input.substring(0, 2 * 2);
        int xulieHaoI = Integer.parseInt(xuLieHao, 16);
        xuLieHao = xulieHaoI + "";

        System.out.println("序列号:" + xuLieHao);

        input = input.substring(2 * 2);
        // 协议号(1 字节)
        String xieYiHao = input.substring(0, 1 * 2);
        input = input.substring(1 * 2);
        // 如果是心跳数据包，给予响应
        if ("1A".equals(xieYiHao)) {
            //设备静止的时候，只传心跳包，所以服务端收到心跳包之后
            //要做些业务，比如，更新设备的最后连接服务器时间，表示设备在线等等
            //以公司业务决定
            // 注意这里是 16 进制的，给终端的时候，发送的是字节流，要把这 16 进制字符串转换成字节数组 Byte2Hex.HexString2Bytes(String hexStr)
            return "54681A0D0A";
        }
        // 如果不是心跳数据包，那么就是 GPS 数据包，下面进行 GPS 数据处理
        //定位时间(6 字节)
        String dateTime = input.substring(0, 6 * 2);
        if ("000000000000".equals(dateTime)) {
            //log.error(userID +"--"+userName +"上来的定位时间全是 0");
            return null;
        }
        // 16 进制时间转换成字符串时间
        dateTime = ProtocolUtil.getSimpleFormatDateTime(dateTime);
        // 碰到传上来的数据，有 3 月 32 号的情况
        dateTime = StringUtil.getStrByDate(StringUtil.getDateByStr(dateTime));
        input = input.substring(6 * 2);
        // 纬度（4 字节）
        String weidu = input.substring(0, 4 * 2);
        weidu = new Double(Integer.parseInt(weidu, 16)) / 1800000 + "";
        input = input.substring(4 * 2);
        // 经度（4 字节）
        String jingdu = input.substring(0, 4 * 2);
        jingdu = new Double(Integer.parseInt(jingdu, 16)) / 1800000 + "";
        input = input.substring(4 * 2);
        // 速度(1 字节)
        String suDu = input.substring(0, 1 * 2);
        int iSuDu = Integer.parseInt(suDu, 16);
        suDu = iSuDu + "";
        input = input.substring(1 * 2);
        // 航向(2 字节)
        String hangXiang = input.substring(0, 2 * 2);
        hangXiang = Integer.parseInt(hangXiang, 16) + "";
        input = input.substring(2 * 2);
        // 保留字节(3 字节)
        String baoLiuZiJie = input.substring(0, 3 * 2);
        input = input.substring(3 * 2);
        // 状态位(4 字节)
        String zhuangTaiWei = input.substring(0, 4 * 2);
        input = input.substring(4 * 2);
        // 4 个字节，32 位
        String byteStatus = ProtocolUtil.str2ByteString(zhuangTaiWei, 32);
        // 东西经标志位
        System.out.println("byteStatus=" + byteStatus);
        String jing = byteStatus.substring(29, 30);
        // 0 表示西经，负数
        if ("0".equals(jing)) {
            jingdu = "-" + jingdu;
        }
        System.out.println("经度:" + jingdu);
        // 南北纬标志位
        String wei = byteStatus.substring(30, 31);
        // 0 表示南纬，负数
        if ("0".equals(wei)) {
            weidu = "-" + weidu;
        }
        System.out.println("纬度:" + weidu);
        return "";
    }

    public GTObject convert(byte[] bytes) {
        //todo implement it
        return null;
    }
}
